# 导入必备的工具包
import torch

# 预定义的网络层torch.nn，工具开发者已经帮助我们开发好一些常用层，
# 比如，卷积层、lstm层、embedding层等等，不需要我们再重复造轮子
import torch.nn as nn

# 数学计算工具包
import math

# torch中变量封装函数Variable
from torch.autograd import Variable


# 定义Embeddings类来实现文本嵌入层，这里s说明代表两个一模一样的嵌入层，它们共享参数
# 该类集成nn.Module，这样就有标准层的一些功能，这里我们也可以理解为一种模式
class Embeddings(nn.Module):
    # 类的初始化函数，即构造函数。有两个参数：
    # d_model指词嵌入的维度
    # vocab_size指词表的大小
    def __init__(self, d_model, vocab_size):
        # 调用父类构造函数
        super(Embeddings, self).__init__()
        # 实例化一个nn中定义的Embedding对象
        self.lut = nn.Embedding(vocab_size, d_model)
        self.d_model = d_model